昨天帮同事解决问题,于是诞生了“超优雅!两行代码搞定 php 无限级分类 获取顶级分类ID”这篇文章。
晚上回家做自己的node.js
项目的时候,又遇到关于无限级分类
的问题了。
其实也不是“遇到”,而是强迫症发作 不睡觉 干脆起床,把之前用递归
现实的版本,改成用循环
实现了。
这次要解决的问题是:根据分类ID
,获取所有下级分类的ID
,
这里说的“所有下级分类”,是包含下级、下下级、下下下级……
另外刚好在学习ES6
,于是用上了Set
对象。
首先还是要将数据处理成{ id:pid, ... }
这种格式,以下是我的数据。
var idPidArr = {
'1': 2,
'2': 0,
'3': 2,
'4': 43,
'5': 2,
'6': 2,
'7': 0,
'8': 0,
'9': 1,
'10': 1,
'11': 1,
'12': 1,
'13': 1,
'14': 1,
'15': 0,
'16': 1,
'17': 102,
'18': 43,
'19': 43,
'20': 3,
'21': 3,
'22': 43,
'23': 43,
'24': 5,
'25': 43,
'26': 43,
'27': 43,
'28': 4,
'29': 4,
'30': 4,
'31': 43,
'32': 111,
'33': 5,
'34': 43,
'35': 5,
'36': 88,
'37': 43,
'38': 43,
'39': 43,
'40': 6,
'41': 70,
'42': 6,
'43': 0,
'44': 43,
'45': 43,
'46': 8,
'47': 8,
'48': 43,
'49': 8,
'50': 43,
'51': 67,
'52': 125,
'53': 43,
'54': 43,
'55': 124,
'56': 0,
'57': 6,
'58': 6,
'59': 111,
'60': 43,
'61': 43,
'62': 56,
'63': 43,
'64': 4,
'65': 43,
'66': 43,
'67': 102,
'68': 43,
'69': 4,
'70': 102,
'71': 56,
'72': 124,
'73': 43,
'74': 43,
'75': 8,
'76': 17,
'77': 43,
'78': 0,
'79': 43,
'80': 43,
'81': 103,
'82': 15,
'83': 17,
'84': 3,
'85': 15,
'86': 3,
'87': 43,
'88': 43,
'89': 111,
'90': 43,
'91': 15,
'92': 6,
'93': 6,
'94': 43,
'95': 53,
'96': 103,
'97': 111,
'98': 6,
'99': 70,
'100': 15,
'101': 6,
'102': 0,
'103': 43,
'104': 103,
'105': 103,
'106': 103,
'107': 7,
'108': 7,
'109': 7,
'110': 7,
'111': 102,
'112': 8,
'113': 1,
'114': 103,
'115': 103,
'116': 43,
'117': 43,
'118': 43,
'119': 125,
'120': 111,
'121': 70,
'122': 111,
'123': 70,
'124': 8,
'125': 8,
'126': 124,
'127': 125,
'128': 88,
'129': 43,
'130': 3,
'131': 43,
'132': 43,
'133': 86,
'134': 21,
'135': 21,
'136': 86,
'137': 20,
'138': 20 };
然后 假设要获取分类 ID: 8 的所有下级分类的 ID。
var bmid = 8;
var pids = new Set([bmid]);
do {
var len = pids.size;
for(var id in idPidArr) {
if (pids.has(idPidArr[id])) {
pids.add(Number(id));
delete idPidArr[id]; // 感谢 @zhoutk 提醒
}
}
} while (pids.size>len);
console.log(Array.from(pids));
输出所有下级分类 ID 数组是 [ 8, 46, 47, 49, 75, 112, 124, 125, 126, 127, 52, 55, 72, 119 ]
然后……没有了,
为什么有一种虎头蛇尾的感觉呢?
代码已经够简洁了,应该不必逐行解释了吧……
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。